# filepath: d:\CompanyProject\Gitee\DBCompareX\backend\app\models\task_data_sync\data_utils.py
"""
数据处理工具模块，负责处理数据格式转换和值比较等功能
"""
from typing import Dict, Any
from datetime import datetime
from decimal import Decimal
from bson import ObjectId
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class DataUtils:
    """数据处理工具类，提供数据格式转换和比较功能"""
    
    @staticmethod
    def handle_special_types(obj: Any) -> Any:
        """
        处理特殊类型，用于MongoDB存储
        
        Args:
            obj: 需要处理的对象
            
        Returns:
            处理后的对象
        """
        if isinstance(obj, Decimal):
            # 将Decimal类型转换为字符串
            return str(obj)
        elif isinstance(obj, ObjectId):
            # 将ObjectId转换为字符串
            return str(obj)
        elif isinstance(obj, datetime):
            # 将datetime转换为ISO格式字符串
            return obj.isoformat()
        # 处理其他可能不兼容的类型
        return obj
    
    @staticmethod
    def process_data_for_mongodb(data: Dict[str, Any]) -> Dict[str, Any]:
        """
        处理数据对象，使其兼容MongoDB存储
        
        Args:
            data: 待处理的数据字典
            
        Returns:
            处理后的数据字典
        """
        result = {}
        for key, value in data.items():
            if isinstance(value, dict):
                result[key] = DataUtils.process_data_for_mongodb(value)
            elif isinstance(value, list):
                result[key] = [DataUtils.handle_special_types(item) if not isinstance(item, dict) 
                              else DataUtils.process_data_for_mongodb(item) for item in value]
            else:
                result[key] = DataUtils.handle_special_types(value)
        return result
    
    @staticmethod
    def compare_values(value1, value2) -> bool:
        """
        对比两个值是否相同
        
        Args:
            value1: 第一个值
            value2: 第二个值
            
        Returns:
            是否相同
        """
        # None值的特殊处理
        if value1 is None and value2 is None:
            return True
        
        if value1 is None or value2 is None:
            return False
        
        # 将Decimal类型转换为字符串再比较
        if isinstance(value1, Decimal) or isinstance(value2, Decimal):
            return str(value1).strip() == str(value2).strip()
        
        # 转换为字符串进行比较
        return str(value1).strip() == str(value2).strip()